home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (DO) / Nibble Volume 09, No. 07 (1988-07)(MicroSPARC)(Side B).zip / Nibble Volume 09, No. 07 (1988-07)(MicroSPARC)(Side B).do / PYRAMID.ML.S < prev    next >
Text File  |  1996-12-24  |  9KB  |  325 lines

  1.  
  2. ********************************
  3. *                              *
  4. *        The Pyramid.ML        *
  5. *                              *
  6. *         by Jim Lazar         *
  7. *                              *
  8. *                              *
  9. *                              *
  10. *                              *
  11. ********************************
  12.  
  13. * Merlin Pro Assembler (128k)
  14.  
  15.           DATE
  16.  
  17. * Equates
  18.  
  19. BASADR    = $EB          ;Hi-res screen base address
  20. XBYTE     = $ED          ;X byte number in screen line
  21. YLINE     = $EE          ;Y line number
  22. CARD      = $EF          ;Card number
  23. ADR1      = $F9          ;General addresses
  24. ADR2      = $FB
  25. YCNT      = $FD          ;Count values
  26. XCNT      = $FE
  27.  
  28. HIRES     = $2000        ;Start of hi-res page
  29. SPEAKER   = $C030        ;Click speaker address
  30. WAIT      = $FCA8        ;Monitor wait routine
  31.  
  32. * Data Addresses
  33.  
  34. YSCRNL    = $0A00        ;Y low address table
  35. YSCRNH    = $0AC0        ;Y high address table
  36. TITDATA   = $0B80        ;Title data
  37. SUITDATA  = $0E00        ;Card middle (suits) data
  38. TOPDATA   = $0FE0        ;Card top (numbers) data
  39. BOTDATA   = $11E8        ;Card bottom (numbers) data
  40. BACKDATA  = $13F0        ;Card back data
  41.  
  42.           ORG $800       ;Start at $800
  43.  
  44. DISCARD   JMP CARDDIS    ;Branch addresses
  45. DISBACK   JMP BACKDIS
  46. DISTIT    JMP CLRTIT
  47. DISBLANK  JMP BLANKDIS
  48.  
  49. * Sound Routine
  50.  
  51. DURATION  HEX 00         ;Duration of tone
  52. FREQ      HEX 00         ;Frequency of tone
  53.  
  54. SOUND     LDY FREQ       ;Load frequency count
  55. :NEXT     LDX FREQ
  56.           LDA #$04
  57.           JSR WAIT       ;Wait a bit
  58.           LDA SPEAKER    ;Click speaker
  59. :FREQSEL  INX
  60.           BNE :FREQSEL
  61.           DEY
  62.           BNE :NEXT
  63.           DEC DURATION   ;Repeat for duration count
  64.           BNE SOUND
  65.           RTS
  66.  
  67. * Clear Screen & Display Title
  68.  
  69. CLRTIT    LDA #>HIRES    ;Set starting address of
  70.           STA BASADR+1   ; hi-res page
  71.           LDA #HIRES
  72.           STA BASADR
  73. :NEXT     LDA #$80       ;Set all hi-res screen
  74.           LDY #0         ; bytes to $80 (all high bits
  75.           STA (BASADR),Y ; on)
  76.           INC BASADR     ;Increment address
  77.           BNE :NEXT
  78.           INC BASADR+1
  79.           LDA BASADR+1   ;If high byte is $40 then
  80.           CMP #$40       ; done
  81.           BCC :NEXT
  82.           LDA #>TITDATA  ;Set starting address of
  83.           STA ADR1+1     ; title data
  84.           LDA #TITDATA
  85.           STA ADR1
  86.           LDX #0
  87. :LINE     TXA            ;Start at top of screen
  88.           TAY
  89.           JSR SETBASE
  90.           LDY #0
  91. :COPY     LDA (ADR1),Y   ;Copy title data to
  92.           ORA #$80       ; screen
  93.           STA (BASADR),Y
  94.           INY
  95.           CPY #40        ;Last byte in line?
  96.           BCC :COPY
  97.           CLC
  98.           LDA ADR1       ;Add 40 to title address
  99.           ADC #40        ; to get next line of data
  100.           STA ADR1
  101.           LDA ADR1+1
  102.           ADC #0
  103.           STA ADR1+1
  104.           INX            ;Increment X (line number)
  105.           CPX #16        ;Check if 16
  106.           BCC :LINE
  107.           RTS
  108.  
  109. *    Display Card on Screen    *
  110.  
  111. CARDDIS   LDA #0         ;Set line count to 0
  112.           STA YCNT
  113.           LDA CARD       ;Get card number
  114.           AND #$0F       ;Chop Suit number off
  115.           TAX
  116.           DEX
  117.           LDA #>TOPDATA  ;Set starting addresses of
  118.           STA ADR1+1     ;top and bottom data
  119.           LDA #TOPDATA
  120.           STA ADR1
  121.           LDA #>BOTDATA
  122.           STA ADR2+1
  123.           LDA #BOTDATA
  124.           STA ADR2
  125.           CPX #0         ;If X is zero address is
  126.           BEQ TOPCARD    ; allready correct
  127. :NEXT     LDA ADR1       ;For each card number add
  128.           CLC            ; $28 to addresses to get
  129.           ADC #$28       ; position of number data
  130.           STA ADR1       ; (top and bottom of card)
  131.           BCC :SKIP1
  132.           INC ADR1+1
  133. :SKIP1    LDA ADR2       ;Do it for both addresses
  134.           CLC
  135.           ADC #$28
  136.           STA ADR2
  137.           BCC :SKIP2
  138.           INC ADR2+1
  139. :SKIP2    DEX            ;Decrememt card number
  140.           BNE :NEXT
  141. TOPCARD   LDY YLINE      ;Set screen base address
  142.           JSR SETBASE
  143.           LDA #0
  144.           STA XCNT       ;Set count
  145. :NEXT     LDY #0
  146.           LDA (ADR1),Y   ;Load card top data
  147.           PHA
  148.           LDA XBYTE      ;Add X byte to count to
  149.           CLC            ; get screen byte number
  150.           ADC XCNT
  151.           TAY
  152.           PLA
  153.           STA (BASADR),Y ;Save on screen
  154.           INC ADR1       ;Increment address
  155.           BNE :SKIP
  156.           INC ADR1+1
  157. :SKIP     INC XCNT       ;Increment counter and check
  158.           LDA XCNT       ; if done with this line
  159.           CMP #4
  160.           BCC :NEXT
  161.           INC YLINE      ;Increment line number and
  162.           INC YCNT       ; line counter
  163.           LDA YCNT
  164.           CMP #10        ;Check if done displaying top
  165.           BCC TOPCARD    ; of card
  166.           LDA #>SUITDATA ;Set starting address of
  167.           STA ADR1+1     ; suit data (middle of card)
  168.           LDA #SUITDATA
  169.           STA ADR1
  170.           LDA CARD       ;Load card number
  171.           AND #$F0       ;Get upper nibble (suit number)
  172.           LSR
  173.           LSR
  174.           LSR
  175.           LSR
  176.           TAX
  177.           CPX #3         ;If card is a spade or club
  178.           BCC :MULT      ; then skip
  179.           LDA XBYTE      ;Check if even or odd column
  180.           LSR            ; for diamonds and hearts to
  181.           BCC :MULT      ; determine the data to use
  182.           INX            ; so orange hearts and diamonds
  183.           INX            ; are not color shifted
  184. :MULT     DEX
  185.           BEQ MIDCARD
  186.           LDA ADR1       ;For each suit number add 80 to
  187.           CLC            ; suit address to get data
  188.           ADC #80        ; position
  189.           STA ADR1
  190.           BCC :MULT
  191.           INC ADR1+1
  192.           BNE :MULT
  193. MIDCARD   LDY YLINE      ;Set screen base address
  194.           JSR SETBASE
  195.           LDA #0
  196.           STA XCNT       ;Set byte count
  197. :NEXT     LDY #0
  198.           LDA (ADR1),Y   ;Load card data byte
  199.           PHA
  200.           LDA XBYTE      ;Add X byte to count to
  201.           CLC            ; get screen byte number
  202.           ADC XCNT
  203.           TAY
  204.           PLA
  205.           STA (BASADR),Y ;Save card data byte on screen
  206.           INC ADR1       ;Increment card data address
  207.           BNE :SKIP
  208.           INC ADR1+1
  209. :SKIP     INC XCNT       ;Increment byte counter
  210.           LDA XCNT       ;Check if end of line
  211.           CMP #4
  212.           BCC :NEXT
  213.           INC YLINE      ;Increment line number and
  214.           INC YCNT       ; counter
  215.           LDA YCNT       ;Check if last line of
  216.           CMP #30        ; card middle
  217.           BCC MIDCARD
  218. BOTCARD   LDY YLINE      ;Set base address
  219.           JSR SETBASE
  220.           LDA #0
  221.           STA XCNT       ;Set count
  222. :NEXT     LDY #0
  223.           LDA (ADR2),Y   ;Load card bottom data
  224.           PHA
  225.           LDA XBYTE      ;Add X byte to count to
  226.           CLC            ; get screen byte number
  227.           ADC XCNT
  228.           TAY
  229.           PLA
  230.           STA (BASADR),Y ;Save on screen
  231.           INC ADR2       ;Increment address
  232.           BNE :SKIP
  233.           INC ADR2+1
  234. :SKIP     INC XCNT       ;Increment counter and check
  235.           LDA XCNT
  236.           CMP #4
  237.           BCC :NEXT
  238.           INC YLINE      ;Increment line number and
  239.           INC YCNT       ; counter
  240.           LDA YCNT
  241.           CMP #40
  242.           BCC BOTCARD
  243.           RTS
  244.  
  245. *      Display Blank Card      *
  246.  
  247. BLANKDIS  LDA #0
  248.           STA YCNT
  249. :DISPLAY  LDY YLINE      ;Set base address
  250.           JSR SETBASE
  251.           LDA #0
  252.           STA XCNT       ;Set count
  253. :NEXT     LDA XBYTE      ;Add X byte to count to
  254.           CLC            ; get screen byte number
  255.           ADC XCNT
  256.           TAY
  257.           LDA #$80       ;Load blank byte
  258.           STA (BASADR),Y ;Save on screen
  259.           INC XCNT       ;Increment counter and check
  260.           LDA XCNT
  261.           CMP #4
  262.           BCC :NEXT
  263.           INC YLINE      ;Increment line number and
  264.           INC YCNT       ; counter
  265.           LDA YCNT
  266.           CMP #40
  267.           BCC :DISPLAY
  268.           RTS
  269.  
  270. *     Display Back of Card     *
  271.  
  272. BACKDIS   LDA #0
  273.           STA YCNT
  274.           LDA #>BACKDATA ;Copy address
  275.           STA ADR1+1
  276.           LDA #BACKDATA
  277.           STA ADR1
  278.           LDA XBYTE      ;If column is even use
  279.           LSR            ; second back data
  280.           BCS :DISPLAY
  281.           LDA ADR1       ;Add $A0 to address to
  282.           CLC            ; get pointer to point to
  283.           ADC #$A0       ; second back data (even)
  284.           STA ADR1
  285.           BCC :DISPLAY
  286.           INC ADR1+1
  287. :DISPLAY  LDY YLINE      ;Set base address
  288.           JSR SETBASE
  289.           LDA #0
  290.           STA XCNT       ;Set count
  291. :NEXT     LDY #0
  292.           LDA (ADR1),Y   ;Load card back data
  293.           PHA
  294.           LDA XBYTE      ;Add X byte to count to
  295.           CLC            ; get screen byte number
  296.           ADC XCNT
  297.           TAY
  298.           PLA
  299.           STA (BASADR),Y ;Save on screen
  300.           INC ADR1       ;Increment address
  301.           BNE :SKIP
  302.           INC ADR1+1
  303. :SKIP     INC XCNT       ;Increment counter and check
  304.           LDA XCNT
  305.           CMP #4
  306.           BCC :NEXT
  307.           INC YLINE      ;Increment line number and
  308.           INC YCNT       ; counter
  309.           LDA YCNT
  310.           CMP #40
  311.           BCC :DISPLAY
  312.           RTS
  313.  
  314. *    Set Screen Base Address   *
  315.  
  316. SETBASE   LDA YSCRNL,Y   ;Load and save screen
  317.           STA BASADR     ; base address
  318.           LDA YSCRNH,Y
  319.           STA BASADR+1
  320.           RTS
  321.  
  322.           DS \
  323.  
  324.           PAGE
  325.